package cn.demoncat.util.lang.entity;

import cn.demoncat.util.exception.ParamRuntimeException;
import cn.demoncat.util.lang.StringUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * HashMap<String,String>
 * 
 * @author 延晓磊
 *
 * @since 2018年8月31日
 */
public class MapSs extends HashMap<String, String>{
 
	private static final long serialVersionUID = 1L;

	/**
	 * 空，不可变
	 */
	public static final Map<String, String> EMPTY = new MapSs();

	/**
	 * 获取，不存在时put
	 *
	 * @param key
	 * @param defaultValue
	 * @return
	 */
	public String get(String key, String defaultValue){
		String v = this.get(key);
		if (v == null) {
			this.put(key, defaultValue);
			return defaultValue;
		}
		return v;
	}

	/**
	 * 实例化
	 * 
	 * @param kvs	键,值,键,值...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2018年11月21日
	 */
	public static MapSs getInstance(String ...kvs) {
		MapSs map = new MapSs();
		if (kvs != null && kvs.length > 0) {
			if (kvs.length % 2 != 0) {
				throw new ParamRuntimeException("参数必须是多组键值对");
			}
			for (int i = 0; i < kvs.length; i += 2) {
				map.put(kvs[i], kvs[i+1]);
			}
		}
		return map;
	}
	
	/**
	 * 添加
	 * 
	 * @param kvs	k,v,k,v...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年2月17日
	 */
	public MapSs add(String ...kvs) {
		if (kvs != null && kvs.length > 0) {
			if (kvs.length % 2 != 0) {
				throw new ParamRuntimeException("参数必须是多组键值对");
			}
			for (int i = 0; i < kvs.length; i += 2) {
				this.put(StringUtil.toString(kvs[i]), kvs[i+1]);
			}
		}
		return this;
	}
	
	/**
	 * 添加
	 * 
	 * @param put	是否添加
	 * @param kvs	k,v,k,v...
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年2月17日
	 */
	public MapSs or(boolean put, String ...kvs) {
		return put ? this.add(kvs) : this;
	}
	
	/**
	 * 添加
	 * 
	 * @param map
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年2月17日
	 */
	public MapSs addAll(Map<String,String> map) {
		this.putAll(map);
		return this;
	}

}
